package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraEmpleadoDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.persistencia.dao.PuestoDAO;
import mx.ipn.to.BitacoraEmpleadoTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.PuestoTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraEmpleadoDAOMySQL implements BitacoraEmpleadoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraEmpleadoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_empleado (id_empleado,fecha,id_puesto) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE bitacora_empleado SET id_empleado=?,fecha=?,id_puesto=? WHERE id_operacion=?";

	private static final String FINDBYID = "SELECT * FROM bitacora_empleado WHERE id_operacion=?";

	private static final String SELECT = "SELECT * FROM bitacora_empleado";
	private static final String SELECTBYRANGOFECHA = "SELECT * FROM bitacora_empleado WHERE fecha>=? and fecha<=?";
	private static final String SELECTBYPUESTO = "SELECT * FROM bitacora_empleado WHERE id_puesto=?";
	private static final String SELECTBYEMPLEADO = "SELECT * FROM bitacora_empleado WHERE id_empleado=?";

	@Override
	public BitacoraEmpleadoTO findBitacoraEmpleadoById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);
			ps.setInt(1, idOperacion);
			ResultSet rs = ps.executeQuery();

			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			PuestoDAO puestoDAO = fabricaMySQL.getPuestoDAO();
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			if (rs.next()) {
				java.sql.Date fecha = rs.getDate("fecha");

				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				PuestoTO puestoTO = puestoDAO.findPuestoById(rs
						.getShort("id_puesto"));

				BitacoraEmpleadoTO bitacoraEmpleadoTO = new BitacoraEmpleadoTO(
						idOperacion, empleadoTO, fecha, puestoTO);

				ps.close();
				conexion.close();
				return bitacoraEmpleadoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraEmpleado(BitacoraEmpleadoTO bitacoraEmpleadoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, bitacoraEmpleadoTO.getEmpleadoTO().getIdEmpleado());
			ps.setDate(2, FechaHoraTO.getFecha(bitacoraEmpleadoTO.getFecha()));
			ps.setShort(3, bitacoraEmpleadoTO.getEmpleadoTO().getPuestoTO().getIdPuesto());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraEmpleadoTO> selectBitacoraEmpleado() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
		
			PuestoDAO puestoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<BitacoraEmpleadoTO> bitacoraEmpleadoTO = null;
			BitacoraEmpleadoTO bitacoraEmpleadoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraEmpleadoTO == null) {
					bitacoraEmpleadoTO = new ArrayList<BitacoraEmpleadoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				int idOperacion = rs.getInt("id_operacion");
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				java.sql.Date fecha = rs.getDate("fecha");
				PuestoTO puestoTO = puestoDAO.findPuestoById(rs
						.getShort("id_puesto"));

				bitacoraEmpleadoTO2 = new BitacoraEmpleadoTO(idOperacion,
						empleadoTO, fecha, puestoTO);

				bitacoraEmpleadoTO.add(bitacoraEmpleadoTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraEmpleadoTO selectBitacoraEmpleadoByEmpleado(int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			PuestoDAO puestoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<PuestoTO> listPuestoTO = null;

			BitacoraEmpleadoTO bitacoraEmpleadoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYEMPLEADO);
			ps.setInt(1, idEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listPuestoTO = new ArrayList<PuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listPuestoTO.add(puestoDAO.findPuestoById(rs
						.getShort("id_puesto")));
			}
			if (listIdOperacion != null) {
				EmpleadoTO empleadoTO = empleadoDAO
						.findEmpleadoById(idEmpleado);
				
				PuestoTO[] arrPuestoTO = (PuestoTO[])listPuestoTO.toArray(new PuestoTO[listPuestoTO.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				
				bitacoraEmpleadoTO = new BitacoraEmpleadoTO(arrIdOperacion,
						empleadoTO, arrFecha, arrPuestoTO);
			}
			ps.close();
			conexion.close();
			return bitacoraEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraEmpleadoTO selectBitacoraEmpleadoByPuesto(short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			PuestoDAO puestoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;

			BitacoraEmpleadoTO bitacoraEmpleadoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPUESTO);
			ps.setShort(1, idPuesto);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado")));
			}
			if (listIdOperacion != null) {
				PuestoTO puestoTO = puestoDAO.findPuestoById(idPuesto);
				
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				
				
				bitacoraEmpleadoTO = new BitacoraEmpleadoTO(arrIdOperacion,
						arrEmpleadoTO, arrFecha, puestoTO);
			}
			ps.close();
			conexion.close();
			return bitacoraEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraEmpleadoTO> selectBitacoraEmpleadoByRangoFecha(
			Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			PuestoDAO puestoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<BitacoraEmpleadoTO> bitacoraEmpleadoTO = null;
			BitacoraEmpleadoTO bitacoraEmpleadoTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHA);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraEmpleadoTO == null) {
					bitacoraEmpleadoTO = new ArrayList<BitacoraEmpleadoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				int idOperacion = rs.getInt("id_operacion");
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				java.sql.Date fecha = rs.getDate("fecha");
				PuestoTO puestoTO = puestoDAO.findPuestoById(rs
						.getShort("id_puesto"));

				bitacoraEmpleadoTO2 = new BitacoraEmpleadoTO(idOperacion,
						empleadoTO, fecha, puestoTO);

				bitacoraEmpleadoTO.add(bitacoraEmpleadoTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateBitacoraEmpleado(BitacoraEmpleadoTO bitacoraEmpleadoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, bitacoraEmpleadoTO.getEmpleadoTO().getIdEmpleado());
			ps.setDate(2, FechaHoraTO.getFecha(bitacoraEmpleadoTO.getFecha()));
			ps.setShort(3, bitacoraEmpleadoTO.getPuestoTO().getIdPuesto());
			ps.setInt(4, bitacoraEmpleadoTO.getIdOperacion());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}

	}

}
